﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace System
{
    /// <summary>
    /// <see cref="IComparable"/> 的扩展方法
    /// </summary>
    public static class ComparableExtensions
    {
        /// <summary>
        /// 检查值是否在指定的最小值和最大值之间（包含边界）
        /// </summary>
        /// <typeparam name="T">需要比较的类型</typeparam>
        /// <param name="value">待检查的值</param>
        /// <param name="minInclusiveValue">最小值（包含）</param>
        /// <param name="maxInclusiveValue">最大值（包含）</param>
        /// <returns>如果值在指定范围内，返回 true；否则返回 false</returns>
        public static bool IsBetween<T>(this T value, T minInclusiveValue, T maxInclusiveValue) where T : IComparable<T>
        {
            return value.CompareTo(minInclusiveValue) >= 0 && value.CompareTo(maxInclusiveValue) <= 0;
        }

        /// <summary>
        /// 检查值是否小于指定的最大值
        /// </summary>
        /// <typeparam name="T">需要比较的类型</typeparam>
        /// <param name="value">待检查的值</param>
        /// <param name="maxValue">最大值</param>
        /// <returns>如果值小于指定的最大值，返回 true；否则返回 false</returns>
        public static bool IsLessThan<T>(this T value, T maxValue) where T : IComparable<T>
        {
            return value.CompareTo(maxValue) < 0;
        }

        /// <summary>
        /// 检查值是否大于指定的最小值
        /// </summary>
        /// <typeparam name="T">需要比较的类型</typeparam>
        /// <param name="value">待检查的值</param>
        /// <param name="minValue">最小值</param>
        /// <returns>如果值大于指定的最小值，返回 true；否则返回 false</returns>
        public static bool IsGreaterThan<T>(this T value, T minValue) where T : IComparable<T>
        {
            return value.CompareTo(minValue) > 0;
        }

        /// <summary>
        /// 检查值是否小于或等于指定的最大值
        /// </summary>
        /// <typeparam name="T">需要比较的类型</typeparam>
        /// <param name="value">待检查的值</param>
        /// <param name="maxValue">最大值</param>
        /// <returns>如果值小于或等于指定的最大值，返回 true；否则返回 false</returns>
        public static bool IsLessThanOrEqual<T>(this T value, T maxValue) where T : IComparable<T>
        {
            return value.CompareTo(maxValue) <= 0;
        }

        /// <summary>
        /// 检查值是否大于或等于指定的最小值
        /// </summary>
        /// <typeparam name="T">需要比较的类型</typeparam>
        /// <param name="value">待检查的值</param>
        /// <param name="minValue">最小值</param>
        /// <returns>如果值大于或等于指定的最小值，返回 true；否则返回 false</returns>
        public static bool IsGreaterThanOrEqual<T>(this T value, T minValue) where T : IComparable<T>
        {
            return value.CompareTo(minValue) >= 0;
        }

        /// <summary>
        /// 检查值是否相等
        /// </summary>
        /// <typeparam name="T">需要比较的类型</typeparam>
        /// <param name="value">待检查的值</param>
        /// <param name="otherValue">与之比较的值</param>
        /// <returns>如果值相等，返回 true；否则返回 false</returns>
        public static bool IsEqualTo<T>(this T value, T otherValue) where T : IComparable<T>
        {
            return value.CompareTo(otherValue) == 0;
        }

        /// <summary>
        /// 检查值是否不相等
        /// </summary>
        /// <typeparam name="T">需要比较的类型</typeparam>
        /// <param name="value">待检查的值</param>
        /// <param name="otherValue">与之比较的值</param>
        /// <returns>如果值不相等，返回 true；否则返回 false</returns>
        public static bool IsNotEqualTo<T>(this T value, T otherValue) where T : IComparable<T>
        {
            return value.CompareTo(otherValue) != 0;
        }
    }
}
